package ihm;

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.TreeMap;

import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;

import agent.model.royaume.AgentRoyaume;

/**
 * Affiche les stats des agents dans une JTable.
 * @author Jean-François Augé
 */
public class InfoPanel extends JPanel implements TableModelListener {

	private static final long serialVersionUID = 1L;
	private AgentRoyaume agent;

	private DefaultTableModel model;
	private JTable table;
	private static String[] COLUMN_NAMES = {"Agent", "Cycle", "Satisfaction", "Satisfaction Moyenne", "Argent", "Prix", "Stock consommation", "Stock production"};

	/**
	 * Constructeur.
	 * @param applet
	 */
	public InfoPanel(AgentRoyaume agent) {
		this.agent = agent;
		setLayout(new BorderLayout());

		model = new DefaultTableModel(initModel(), COLUMN_NAMES);
		model.addTableModelListener(this);

		table = new JTable(model) {
			private static final long serialVersionUID = 1L;

			//  Returning the Class of each column will allow different
			//  renderers to be used based on Class
			@Override
			public Class<? extends Object> getColumnClass(int column) {
				switch(column) {
				case 0:
					return String.class;
				case 1:
					return Double.class;
				case 2 :
					return Double.class;
				case 3 :
					return Double.class;
				case 4 :
					return Double.class;
				case 5 :
					return Double.class;
				case 6 :
					return Double.class;
				default:
					return Object.class;
				}
			}

			@Override
			public boolean isCellEditable(int row, int column) {
				return false;
			}

			@Override
			public TableCellRenderer getCellRenderer(int row, int column) {
				if(column == 0)
					return new CustomCellRenderer();
				return super.getCellRenderer(row, column);
			}
		};
		table.setPreferredScrollableViewportSize(table.getPreferredSize());
		table.setFillsViewportHeight(true);
		table.setEnabled(false);

		//table.getColumnModel().getColumn(0).setCellRenderer(new CustomCellRenderer());

		add(new JScrollPane(table), BorderLayout.CENTER);
	}

	/**
	 * Retourne un tableau vide pour initialiser le modèle de la JTable.
	 * @return Object[][], les données pour initialiser le modèle de la JTable
	 */
	public Object[][] initModel() {
		Object[][] data = new Object[0][COLUMN_NAMES.length];
		return data;
	}

	/**
	 * Va chercher les données dans la base pour mettre à jour le modèle de la JTable.
	 * @return ArrayList<Object[]>, les données pour initialiser le modèle de la JTable
	 */
	public ArrayList<Object[]> populateModel() {
		double[] tmp = null;
		double[] total = null;

		HashMap<String, double[]> map = agent.getMap();
		TreeMap<String, double[]> resultats = new TreeMap<String, double[]>(map);
		ArrayList<Object[]> list = new ArrayList<Object[]>();

		try {
			total = new double[COLUMN_NAMES.length-1];
			for(Entry<String, double[]> e : resultats.entrySet()) {
				Object[] line = new Object[COLUMN_NAMES.length];
				line[0] = e.getKey();
				tmp = e.getValue();
				for(int j=0; j<(COLUMN_NAMES.length-1); j++) {
					line[j+1] = tmp[j];
					total[j] += tmp[j];
				}
				list.add(line);
			}

			// ajout le total
			Object[] line = new Object[COLUMN_NAMES.length];
			Object[] empty = new Object[0];
			line[0] = "Total";
			for(int j=0; j<(COLUMN_NAMES.length-1); j++)
				line[j+1] = total[j];
			list.add(empty);
			list.add(line);
		}
		catch(NoSuchElementException e) {
			e.printStackTrace();
		}

		return list;
	}

	/**
	 * Met à jour le modèle de la JTable.
	 */
	public void updateTableInfo() {
		ArrayList<Object[]> list = populateModel();
		model.setRowCount(0);
		for(int i=0; i<list.size(); i++)
			model.addRow(list.get(i));
	}

	@Override
	public void tableChanged(TableModelEvent e) {
		// inutilisé
	}

}
